package com.ihcy.base.core.enums;

import com.fasterxml.jackson.annotation.JsonValue;
import com.fasterxml.jackson.databind.deser.std.EnumDeserializer;

import java.util.Objects;

/**
 * 如果枚举名称和实际值不同，请务必重写 getKey 方法
 * 枚举定义规范：枚举名切记大写，描述尽量清晰，不要出现错误拼写，请自觉仔细检查
 * 例如
 * MONDAY("monday","星期一")
 * @param <T>
 */
public interface EnumAbility <T>{
    /**
     * 返回枚举实际值
     * JsonValue  处理 Jackson 序列化问题,仅限于 字符串和 整形
     * @see EnumDeserializer
     */
    @JsonValue
    T getCode();

    /**
     * 返回枚举描述
     */
    String getDescription();

    String name();
    /**
     * 对比当前枚举对象和传入的枚举值是否一致（String类型会忽略大小写）
     * 当前枚举项是否匹配远端传入的值（比如：数据库的字段值、rpc传入的参数值）
     *
     * @param enumCode 枚举 code
     * @return 是否匹配
     */
    default boolean codeEquals(T enumCode){
        if(enumCode ==null) return false;
        if(enumCode instanceof String){
            return ((String) enumCode).equalsIgnoreCase((String) getCode());
        }else {
            return Objects.equals(this.getCode(), enumCode);
        }
    }

    /**
     * 对比两个枚举项是否完全相同（==）
     *
     * @param anotherEnum 枚举
     * @return 是否相同
     */
    default boolean equals(EnumAbility<T> anotherEnum){
        return this == anotherEnum;
    }
}
